﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//int main()
//{
//	int* p = malloc(10 * sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	
//	free(p);
//	return 0;
//}

//#define MALLOC(num,type) (type*)malloc(num*sizeof(type))
//
//int main()
//{
//	int* p = MALLOC(10,int);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	free(p);
//	return 0;
//}


//#define GENERIC_MAX(type)\
//	type type##_max(type a,type b)\
//{\
//		return (a>b?a:b);\
//}
//
//
//
//GENERIC_MAX(int)//替换到宏体内后int##_max ⽣成了新的符号 int_max做函数名
//GENERIC_MAX(float)//替换到宏体内后float##_max ⽣成了新的符号 float_max做函数名
//
//
//
//int main()
//{
//	printf("%d\n", int_max(3, 6));
//	printf("%f\n", float_max(3.8f, 6.3f));
//	return 0;
//}

//#define M 100//后续我们不再使用该定义或者需要修改该定义，我们就要使用#undef先删除原定义
////#define M 200//直接修改编译器会发出警告
//#undef M//
//#define M 200
//
//int main()
//{
//	return 0;
//
// }

#include <stdio.h>
//#define __DEBUG__ 
////#undef __DEBUG__
//int main()
//{
//	int i = 0;
//	int arr[10] = { 0 };
//	for (i = 0; i < 10; i++)
//	{
//		arr[i] = i;
//#ifdef __DEBUG__//如果__DEBUG__被#define定义过，就执行下一句代码，如果没有定义，则不执行
//		printf("%d\n", arr[i]);//如果我们想看数组是否被赋值，就可以通过定义__DEBUG__来查看
//#endif //__DEBUG__
//	}
//	return 0;
//}


//1.
#if //加常量表达式
//...
#endif
//常量表达式由预处理器求值。

//如：
#define __DEBUG__ 1
#if __DEBUG__
//..
#endif


//2.多个分⽀的条件编译
#if //加常量表达式
//...
#elif //加常量表达式
//...
#else
//...
#endif


//3.判断是否被定义
#if defined(symbol)
#endif
#ifdef symbol
#endif
#if !defined(symbol)
#endif
#ifndef symbol
#endif


//4.嵌套指令
#if defined(OS_UNIX)
	#ifdef OPTION1
		unix_version_option1();
	#endif
	#ifdef OPTION2
		unix_version_option2();
	#endif
#elif defined(OS_MSDOS)
	#ifdef OPTION2
		msdos_version_option2();
	#endif
#endif